package com.kaizeli.website.controller;

import com.kaizeli.website.response.Result;
import com.kaizeli.website.service.ProjectImportService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * 项目导入控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/project")
@Tag(name = "项目导入接口", description = "项目Excel导入相关接口")
@SecurityRequirement(name = "Bearer Authentication")
public class ProjectImportController {

    @Autowired
    private ProjectImportService projectImportService;

    /**
     * 上传Excel文件导入项目数据（新增模式：已存在则跳过）
     */
    @PostMapping("/import")
    @Operation(summary = "导入项目Excel（新增模式）", description = "上传Excel文件，批量导入项目数据。如果项目编码已存在则跳过")
    public Result<Map<String, Object>> importProjectExcel(
            @RequestParam("file") MultipartFile file) {
        
        log.info("接收到项目导入请求（新增模式），文件名：{}", file.getOriginalFilename());
        
        try {
            // 使用新增模式（已存在则跳过）
            Map<String, Object> result = projectImportService.importProjectExcel(file, false);
            
            Boolean success = (Boolean) result.get("success");
            if (Boolean.TRUE.equals(success)) {
                return Result.success(result);
            } else {
                return Result.error(500, result.get("message").toString());
            }
            
        } catch (Exception e) {
            log.error("导入项目Excel失败", e);
            return Result.error(500, "导入失败：" + e.getMessage());
        }
    }

    /**
     * 上传Excel文件导入项目数据（更新模式：已存在则更新）
     */
    @PostMapping("/import-update")
    @Operation(summary = "导入项目Excel（更新模式）", description = "上传Excel文件，批量导入项目数据。如果项目编码已存在则更新，不存在则新增")
    public Result<Map<String, Object>> importProjectExcelWithUpdate(
            @RequestParam("file") MultipartFile file) {
        
        log.info("接收到项目导入请求（更新模式），文件名：{}", file.getOriginalFilename());
        
        try {
            // 使用更新模式（已存在则更新）
            Map<String, Object> result = projectImportService.importProjectExcel(file, true);
            
            Boolean success = (Boolean) result.get("success");
            if (Boolean.TRUE.equals(success)) {
                return Result.success(result);
            } else {
                return Result.error(500, result.get("message").toString());
            }
            
        } catch (Exception e) {
            log.error("导入项目Excel失败", e);
            return Result.error(500, "导入失败：" + e.getMessage());
        }
    }

    /**
     * 下载项目导入模板
     */
    @GetMapping("/template")
    @Operation(summary = "下载项目导入模板", description = "下载Excel模板文件，用于批量导入项目")
    public ResponseEntity<byte[]> downloadTemplate() {
        
        log.info("接收到下载模板请求");
        
        try {
            byte[] templateBytes = projectImportService.downloadTemplate();
            
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", 
                    java.net.URLEncoder.encode("项目导入模板.xlsx", "UTF-8"));
            
            return ResponseEntity.ok()
                    .headers(headers)
                    .body(templateBytes);
                    
        } catch (Exception e) {
            log.error("下载模板失败", e);
            return ResponseEntity.internalServerError().build();
        }
    }

    /**
     * 获取导入说明
     */
    @GetMapping("/import/help")
    @Operation(summary = "获取导入说明", description = "获取项目Excel导入的字段说明和注意事项")
    public Result<Map<String, Object>> getImportHelp() {
        
        Map<String, Object> help = new java.util.HashMap<>();
        help.put("title", "项目Excel导入说明");
        
        Map<String, String> fields = new java.util.HashMap<>();
        fields.put("项目编码", "必填，唯一标识，最长64字符");
        fields.put("项目名称", "必填，最长100字符");
        fields.put("项目描述", "选填，项目详细描述");
        fields.put("项目状态", "选填，1-未开始, 2-进行中, 3-已暂停, 4-已取消, 5-已完成（默认1）");
        fields.put("优先级", "选填，1-最高, 2-高, 3-中, 4-低, 5-最低（默认3）");
        fields.put("开始日期", "选填，格式：YYYY-MM-DD（如：2024-01-01）");
        fields.put("结束日期", "选填，格式：YYYY-MM-DD（如：2024-12-31）");
        fields.put("项目预算", "选填，数字格式（如：1000000.00）");
        fields.put("预计成本率", "选填，百分比（如：15.25表示15.25%）");
        fields.put("项目类型", "选填，1-整包项目, 2-人力项目");
        fields.put("项目进度", "选填，0-100的整数（默认0）");
        fields.put("是否公开", "选填，0-否, 1-是（默认0）");
        help.put("fields", fields);
        
        java.util.List<String> notes = java.util.Arrays.asList(
            "1. Excel第一行为字段名称，第二行开始为数据",
            "2. 项目编码必须唯一，不能与数据库中已存在的项目编码重复",
            "3. 日期格式必须为YYYY-MM-DD（如：2024-01-01）",
            "4. 建议先下载模板，参考示例数据填写",
            "5. 导入过程中遇到错误会返回详细的错误信息",
            "6. 支持批量导入，单次最多建议不超过1000条",
            "7. 文件格式支持.xlsx和.xls",
            "8. 文件大小不超过10MB"
        );
        help.put("notes", notes);
        
        return Result.success(help);
    }
}

